Extensibility is found in most modern operating systems, but it is often limited to supporting new devices, not specializing the usage of system resources. One technique exposes operating system policies to applications via event/handler extensions. This is described in B. N. Bershad et al., Extensibility, Safety and Performance in the Operating System, Proceedings of the Fifteenth Symposium on Operating System Principles, 1995. A second technique provides adaptive in-kernel policies that manage resources based on application usage patterns. This is described in C. Pu et al., Optimistic Incremental Specialization: Streamlining a Commercial Operating System, Proceedings of the Fifteenth Symposium on Operating System Principles, 1995; and P. Cao et al., Implementation and Performance of Application-Controlled File Caching, Proceedings of the First Symposium on Operating Systems Design and Implementation (OSDI '94), pp. 165-177, November 1994. A third technique replaces underlying components of the operating system with new components referred to as library operating systems. This is described in D. R. Engler et al., Exokernel: An Operating System Architecture for Application-Level Resource Management, Proceedings of the Fifteenth Symposium on Operating System Principles, 1995.
AIX is an example of an operating system that allows limited extensibility in the form of new device drivers, system calls, and autonomous user-installed kernel processes. Another example, Microsoft's Windows NT, provides the same extension abilities without the ability to add new system calls.
Event/handler extensions refer to the extensibility achieved by allowing applications to install handler code in the kernel. This handler code is triggered by normal operating system events such as processing incoming or outgoing network packets. The ability to install event-triggered handler code in the kernel reduces overhead due to kernel/user interactions such as system calls, memory space copies and maintenance of kernel-supplied user abstractions such as sockets. This is especially useful when several operating system components are used together.
Adaptive operating system mechanisms are useful where the performance of an application might be improved by specializing management of the applications resources dynamically and transparently. An example of this is specializing the open()/read()/write()/close() application programmer interfaces (APIs) on the fly such that the implementations are optimized differently for short-lived random accesses than for long lived sequential accesses. Another example of adaptive extensibility is found in file buffer management. Instead of using the same replacement policies for all file buffers, the file buffers for a particular application can be specialized for large, small, sequential, or random access patterns.
Library operating systems are functionally equivalent to event/handler extensibility. The difference between the two extension techniques is a software engineering perspective. Library operating systems provide a "take it or leave it" extensible environment for applications of a certain type while event/handler extensibility provides low level "building block" style extensibility for individual applications or extensions. An example combining the two can be found in D. A. Wallach et al., Application-Specific Handlers for High-Performance Message, Proceedings from the Symposium of Communication Architectures and Protocols (SIGCOMM '96), 1996, where ASHes (Application Specific Handlers) augment the library operating system approach.